La POO (Programmation Orientée Objet) est un paradigme de programmation qui organise le code autour d'"objets" qui contiennent à la fois des données (attributs) et des comportements (méthodes).
1. Classes et Objets
Une classe est un modèle pour créer des objets. Un objet est une instance d'une classe.
class Personne:
def __init__(self, nom, age):
self.nom = nom
self.age = age
self.ville = "Paris"
def se_presenter(self):
return f"Je m'appelle {self.nom} et j'ai {self.age} ans."
def anniversaire(self):
self.age += 1
return f"Joyeux anniversaire! J'ai maintenant {self.age} ans."
personne1 = Personne("Alice", 25)
personne2 = Personne("Bob", 30)
print(personne1.se_presenter())
print(personne2.se_presenter())
print(personne1.anniversaire())
Le mot-clé self fait référence à l'instance actuelle de la classe. Il est obligatoire comme premier paramètre des méthodes d'instance.
2. Attributs de Classe et Méthodes Statiques
class Employe:
entreprise = "TechCorp"
nombre_employes = 0
def __init__(self, nom, salaire):
self.nom = nom
self.salaire = salaire
Employe.nombre_employes += 1
@staticmethod
def info_entreprise():
return f"{Employe.entreprise} - Employés: {Employe.nombre_employes}"
@classmethod
def creer_employe_par_defaut(cls):
return cls("Nouvel Employé", 30000)
emp1 = Employe("Alice", 50000)
emp2 = Employe("Bob", 45000)
print(Employe.info_entreprise())
print("Entreprise:", emp1.entreprise)
emp3 = Employe.creer_employe_par_defaut()
print(emp3.nom, emp3.salaire)
Différence importante :
• @staticmethod : Méthode utilitaire qui n'a pas besoin d'accéder aux attributs
• @classmethod : Méthode qui travaille avec la classe plutôt qu'une instance
3. Héritage
L'héritage permet de créer une nouvelle classe basée sur une classe existante.
class Animal:
def __init__(self, nom, age):
self.nom = nom
self.age = age
def parler(self):
return "Je fais un son"
def se_decrire(self):
return f"Je suis {self.nom}, j'ai {self.age} ans."
class Chien(Animal):
def __init__(self, nom, age, race):
super().__init__(nom, age)
self.race = race
def parler(self):
return "Woof! Woof!"
class Chat(Animal):
def parler(self):
return "Miaou!"
mon_chien = Chien("Rex", 3, "Labrador")
mon_chat = Chat("Misty", 2)
print(mon_chien.se_decrire())
print(mon_chien.parler())
print(mon_chat.parler())
print("Race du chien:", mon_chien.race)
4. Encapsulation et Propriétés
L'encapsulation permet de protéger les données internes d'une classe.
class CompteBancaire:
def __init__(self, titulaire, solde_initial):
self.titulaire = titulaire
self._solde = solde_initial
@property
def solde(self):
return self._solde
def deposer(self, montant):
if montant > 0:
self._solde += montant
return True
return False
def retirer(self, montant):
if 0 < montant <= self._solde:
self._solde -= montant
return True
return False
compte = CompteBancaire("Alice", 1000)
print("Solde initial:", compte.solde)
compte.deposer(500)
print("Après dépôt:", compte.solde)
if compte.retirer(200):
print("Retrait réussi. Nouveau solde:", compte.solde)
else:
print("Retrait impossible")